home *** CD-ROM | disk | FTP | other *** search
/ Workbench Add-On / Workbench Add-On - Volume 1.iso / Dev / Oberon / source / Library / MathL.mod < prev    next >
Text File  |  1995-06-29  |  4KB  |  171 lines

  1. (*************************************************************************
  2.  
  3.      $RCSfile: MathL.mod $
  4.   Description: Basic functions for LONGREALs.
  5.  
  6.    Created by: fjc (Frank Copeland)
  7.     $Revision: 1.4 $
  8.       $Author: fjc $
  9.         $Date: 1995/06/04 23:22:41 $
  10.  
  11.   Copyright © 1994-1995, Frank Copeland.
  12.   This file is part of the Oberon-A Library.
  13.   See Oberon-A.doc for conditions of use and distribution.
  14.  
  15.   Thanks to Mike Griebling and Rene Hogendoorn for their assistance.
  16.  
  17. *************************************************************************)
  18.  
  19. MODULE MathL;
  20.  
  21. (*
  22.  
  23.   This module will not be implemented until the following two modules are
  24.   implemented.
  25.  
  26. IMPORT m1 := MathIeeeDoubBas, m2 := MathIeeeDoubTrans;
  27.  
  28. CONST
  29.   pi *= 3.14159265358979323846;
  30.   e  *= 2.71828182845904523536;
  31.  
  32.  
  33. PROCEDURE sqrt * ( x : LONGREAL ) : LONGREAL;
  34. BEGIN (* sqrt *)
  35.   RETURN m2.Sqrt (x)
  36. END sqrt;
  37.  
  38.  
  39. PROCEDURE power * ( x, base : LONGREAL ) : LONGREAL;
  40. BEGIN (* power *)
  41.   RETURN m2.Pow (base, x)
  42. END power;
  43.  
  44.  
  45. PROCEDURE exp * ( x : LONGREAL ) : LONGREAL;
  46. BEGIN (* exp *)
  47.   RETURN m2.Exp (x)
  48. END exp;
  49.  
  50.  
  51. PROCEDURE ln * ( x : LONGREAL ) : LONGREAL;
  52. BEGIN (* ln *)
  53.   RETURN m2.Log (x)
  54. END ln;
  55.  
  56.  
  57. PROCEDURE log * ( x, base : LONGREAL ) : LONGREAL;
  58. BEGIN (* log *)
  59.   RETURN m2.Log (x) / m2.Log (base)
  60. END log;
  61.  
  62.  
  63. PROCEDURE round * ( x : LONGREAL ) : LONGREAL;
  64. BEGIN (* round *)
  65.   IF x < 0.0 THEN RETURN m1.Ceil (x - 0.5)
  66.   ELSE RETURN m1.Floor (x + 0.5)
  67.   END
  68. END round;
  69.  
  70.  
  71. PROCEDURE sin * ( x : LONGREAL ) : LONGREAL;
  72. BEGIN (* sin *)
  73.   RETURN m2.Sin (x)
  74. END sin;
  75.  
  76.  
  77. PROCEDURE cos * ( x : LONGREAL ) : LONGREAL;
  78. BEGIN (* cos *)
  79.   RETURN m2.Cos (x)
  80. END cos;
  81.  
  82.  
  83. PROCEDURE tan * ( x : LONGREAL ) : LONGREAL;
  84. BEGIN (* tan *)
  85.   RETURN m2.Tan (x)
  86. END tan;
  87.  
  88.  
  89. PROCEDURE arcsin * ( x : LONGREAL ) : LONGREAL;
  90. BEGIN (* arcsin *)
  91.   RETURN m2.Asin (x)
  92. END arcsin;
  93.  
  94.  
  95. PROCEDURE arccos * ( x : LONGREAL ) : LONGREAL;
  96. BEGIN (* arccos *)
  97.   RETURN m2.Acos (x)
  98. END arccos;
  99.  
  100.  
  101. PROCEDURE arctan * ( x : LONGREAL ) : LONGREAL;
  102. BEGIN (* arctan *)
  103.   RETURN m2.Atan (x)
  104. END arctan;
  105.  
  106.  
  107. PROCEDURE arctan2 * ( xn, xd : LONGREAL ) : LONGREAL;
  108.  
  109.   CONST piBy2 = 1.57079632679489161923;
  110.   VAR res : LONGREAL;
  111.  
  112. BEGIN
  113.   IF xd = 0.0 THEN
  114.     IF xn = 0.0 THEN RETURN 0.0
  115.     ELSE IF xn < 0.0 THEN RETURN -piBy2 ELSE RETURN piBy2 END
  116.     END
  117.   (* Checking for Overflow/Underflow at this point appears unnecessary,
  118.      as testing without the checks seems to produce the correct results.
  119.      [Possibly 'famous last words' by fjc :-)]
  120.   ELSIF Overflow(xn/xd) THEN
  121.     IF xn < 0.0 THEN RETURN -piBy2 ELSE RETURN piBy2 END
  122.   ELSIF Underflow(xn/xd) THEN res := 0.0
  123.   *)
  124.   ELSE res := arctan(ABS(xn/xd))
  125.   END;
  126.   IF xd < 0.0 THEN res := pi - res END;
  127.   IF xn < 0.0 THEN RETURN -res ELSE RETURN res END
  128. END arctan2;
  129.  
  130.  
  131. PROCEDURE sinh * ( x : LONGREAL ) : LONGREAL;
  132. BEGIN (* sinh *)
  133.   RETURN m2.Sinh (x)
  134. END sinh;
  135.  
  136.  
  137. PROCEDURE cosh * ( x : LONGREAL ) : LONGREAL;
  138. BEGIN (* cosh *)
  139.   RETURN m2.Cosh (x)
  140. END cosh;
  141.  
  142.  
  143. PROCEDURE tanh * ( x : LONGREAL ) : LONGREAL;
  144. BEGIN (* tanh *)
  145.   RETURN m2.Tanh (x)
  146. END tanh;
  147.  
  148.  
  149. PROCEDURE arcsinh * ( x : LONGREAL ) : LONGREAL;
  150. BEGIN (* arcsinh *)
  151.   RETURN m2.Log (x + m2.Sqrt (x * x + 1.0))
  152. END arcsinh;
  153.  
  154.  
  155. PROCEDURE arccosh * ( x : LONGREAL ) : LONGREAL;
  156. BEGIN (* arccosh: x >= 1.0 *)
  157.   RETURN m2.Log (x + m2.Sqrt (x * x - 1.0))
  158. END arccosh;
  159.  
  160.  
  161. PROCEDURE arctanh * ( x : LONGREAL ) : LONGREAL;
  162. BEGIN (* arctanh: 0 <= x*x <= 1 *)
  163.   RETURN 0.5 * m2.Log ((1.0 + x) / (1.0 - x))
  164. END arctanh;
  165.  
  166.  
  167. BEGIN
  168.   ASSERT (m1.base # NIL, 100); ASSERT (m2.base # NIL, 100)
  169. *)
  170. END MathL.
  171.